package com.comac.tasks.manager.app.utils;

import cn.hutool.core.lang.Snowflake;

import java.util.Random;

public class CustomSnowflake {
    private static final Snowflake SNOWFLAKE = new Snowflake();

    private final Random random = new Random();

    public static long nextId() {
        long id = SNOWFLAKE.nextId();
        // 取后5位作为随机数位
//        return (id & ~0x1F) | random.nextInt(32);
        return optimizeLastBits(id);
    }

    /**
     * 优化 ID 的最后几位，以避免模 4 结果大部分为 0 的情况
     *
     * @param id 需要优化的 ID
     * @return 优化后的 ID
     */
    private static long optimizeLastBits(long id) {
        // 获取最后12位序列号
        long sequence = id & ((1L << 12) - 1);

        // 生成一个伪随机数，这里使用当前时间纳秒级的部分
        long nanoTime = System.nanoTime() % 1000;

        // 对序列号进行优化
        long optimizedSequence = (sequence ^ nanoTime) & ((1L << 12) - 1);

        // 将优化后的序列号放回原ID
        return (id & ~((1L << 12) - 1)) | optimizedSequence;
    }
}
